﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Configuration;

using rent_car.Manejadores;

namespace rent_car.Gui
{
    public partial class FormNuevoVehiculo : Form
    {
        public FormNuevoVehiculo()
        {
            inicializar();
        }

        public FormNuevoVehiculo(vehiculo vehiculoAModificar)
        {
            inicializar();
            vehiculoModificado = vehiculoAModificar;
            cargarCampos();
        }

        private void inicializar()
        {
            InitializeComponent();
            manejadorDeVehiculos = ManejadorDeVehiculos.getInstancia();
            validadorDeForm = new ValidadorDeFormularios();
            manejadorDeMarcas = ManejadorDeMarcas.getInstancia();
            cargarCbMarcas();
            cargarCbMotor();
            cargarCbEstadoVehiculo();
            cargarCbTransmision();
            pathImagenVehiculo = ConfigurationSettings.AppSettings["pathImagenDefault"];
            ofImagenVehiculo.Title = "";
            ofImagenVehiculo.Filter = "JPEG Imágenes|*.jpg|GIF Imágenes|*.gif|PNG Imágenes|*.png";
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            if (validarFormulario())
            {
                if (vehiculoModificado == null)
                {
                    agregarVehiculo();
                    MessageBox.Show(null, "Vehículo agregado con éxito", "Información", MessageBoxButtons.OK);
                }
                else
                {
                    modificarVehiculo();
                    manejadorDeVehiculos.modificar(vehiculoModificado);
                    MessageBox.Show(null, "Vehículo modificado con éxito", "Información", MessageBoxButtons.OK); 

                }
            }
        }

        private void agregarVehiculo()
        {
            marca marcaVehiculo = (marca)cbMarca.SelectedItem;
            manejadorDeVehiculos.agregar(new vehiculo(){
                marca_id = marcaVehiculo.marca_id,
                modelo = txtModelo.Text,
                ano = txtAno.Text,
                color = txtColor.Text,
                transmision = cbTransmision.Text,
                motor = cbMotor.Text,
                placa = txtPlaca.Text,
                estado = cbEstado.Text,
                observacion = txtObservacion.Text,
                img_vehiculo= pathImagenVehiculo, 
                activo = true});
            limpiarCampos();
        }

        private void modificarVehiculo()
        {
            marca marcaVehiculo = (marca)cbMarca.SelectedItem;
            vehiculoModificado.marca_id = marcaVehiculo.marca_id;
            vehiculoModificado.modelo = txtModelo.Text;
            vehiculoModificado.ano = txtAno.Text;
            vehiculoModificado.color = txtColor.Text;
            vehiculoModificado.transmision = cbTransmision.Text;
            vehiculoModificado.motor = cbMotor.Text;
            vehiculoModificado.placa = txtPlaca.Text;
            vehiculoModificado.estado = cbEstado.Text;
            vehiculoModificado.observacion = txtObservacion.Text;
            vehiculoModificado.img_vehiculo = pathImagenVehiculo;
            vehiculoModificado.activo = true;
            
        }

        private void cargarCbMarcas()
        {
            cbMarca.DataSource = manejadorDeMarcas.getObject();
        }

        private void cargarCbMotor()
        { 
            string motor = ConfigurationManager.AppSettings["motores"];
            string[] motores = motor.Split('|');
            cbMotor.DataSource = motores;
        }

        private void cargarCampos()
        {
            txtModelo.Text = vehiculoModificado.modelo;
            txtAno.Text = vehiculoModificado.ano;
            txtColor.Text = vehiculoModificado.color;
            txtPlaca.Text = vehiculoModificado.placa;
            cbMarca.SelectedIndex = manejadorDeMarcas.getItem(vehiculoModificado.marca_id) - 1;
            cbMotor.Text = vehiculoModificado.motor;
            cbEstado.Text = vehiculoModificado.estado;
            cbTransmision.Text = vehiculoModificado.transmision;
            txtObservacion.Text = vehiculoModificado.observacion;
            pbImagenVehiculo.ImageLocation = vehiculoModificado.img_vehiculo;
        }

        private void cargarCbEstadoVehiculo()
        {
            string estado = ConfigurationManager.AppSettings["estadoVehiculo"];
            string[] estados = estado.Split('|');
            cbEstado.DataSource = estados;
        }

        private void cargarCbTransmision()
        {
            string transmision = ConfigurationManager.AppSettings["transmisionVehiculo"];
            string[] transmisiones = transmision.Split('|');
            cbTransmision.DataSource = transmisiones;
        }

        private bool validarFormulario()
        {
            return validadorDeForm.validarCamposEspecificos(txtModelo, txtColor, txtPlaca, txtCambioAceiteDias);
        }

        // Guarda la imagen
        private void obtenerImagen()
        {
            if (ofImagenVehiculo.ShowDialog() != DialogResult.Cancel)
            {
                pathImagen = ofImagenVehiculo.FileName;
                string pathImagenFolder = ConfigurationManager.AppSettings["pathFolderVehiculos"];
                FileInfo fI = new FileInfo(pathImagen);
                pathImagenAGuardar = pathImagenFolder + @"\" + fI.Name;
                if (Directory.Exists(pathImagenFolder))
                { 
                    if (File.Exists(pathImagenAGuardar))
                    {
                        pathTemporal = pathImagenAGuardar;
                        MessageBox.Show(null, "Ya existe un vehículo con ese nombre", "Alerta", MessageBoxButtons.OK);
                        obtenerImagen();
                    }
                    else
                    {
                        try
                        {
                            if (contador > 0 && !pathTemporal.Equals(pathImagenAGuardar))
                            {
                                File.Delete(pathTemporal);
                            }
                            File.Copy(pathImagen, pathImagenAGuardar);
                            pathTemporal = pathImagenAGuardar;
                            pathImagenVehiculo = pathImagenAGuardar;
                        }
                        catch (Exception ex)
                        {
                            pathImagenAGuardar = ConfigurationSettings.AppSettings["pathImagenDefault"];
                            MessageBox.Show(null, "La imagen no pudo ser guardada", "Alerta", MessageBoxButtons.OK);
                            obtenerImagen();
                        }
                    }
                }
                else
                {
                    Directory.CreateDirectory(pathImagenFolder);
                    obtenerImagen();
                }
                contador++;
            }
        }

        private void btnCargarImagen_Click(object sender, EventArgs e)
        {
            obtenerImagen();
            pbImagenVehiculo.ImageLocation = pathImagenVehiculo;
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            if (pathImagenVehiculo != null)
            {
                File.Delete(pathImagenVehiculo);
            }
        }
        
        #region limpiar errorPrivider
        private void txtCambioAceiteDias_LostFocus(object sender, EventArgs e)
        {
           validadorDeForm.limpiarErrores(txtCambioAceiteDias); 
        }
        private void txtPlaca_LostFocus (object sender, EventArgs e)
        {
            validadorDeForm.limpiarErrores(txtPlaca);
        }
        private void txtColor_LostFocus (object sender, EventArgs e)
        {
            validadorDeForm.limpiarErrores(txtColor);
        }
        private void txtModelo_LostFocus(object sender, EventArgs e)
        {
            validadorDeForm.limpiarErrores(txtModelo);
        }
        #endregion

        private void limpiarCampos()
        {
            validadorDeForm.LimpiarCampos(pnlVehiculo);
        }

        private string pathImagenVehiculo = null;
        private string pathImagenAGuardar = null;
        private string pathImagen = null;
        private ManejadorDeVehiculos manejadorDeVehiculos = null;
        private ValidadorDeFormularios validadorDeForm = null;
        private ManejadorDeMarcas manejadorDeMarcas = null;
        private vehiculo vehiculoModificado = null;
        private int contador;
        string pathTemporal;
    }
}
